package jmine.tec.json;

import java.io.IOException;
import java.io.Serializable;
import java.io.Writer;
import java.util.Collection;
import java.util.Map;

/**
 * JSON
 * 
 * @author takeshi
 */
public interface JSON extends Serializable {

    /**
     * Deve devolver o 'tamanho' deste objeto
     * 
     * @return int
     */
    int getSize();

    /**
     * Deve devolver os nomes dos campos
     * 
     * @return {@link Collection} de String
     */
    Collection<String> getPropertyNames();

    /**
     * Devolve os valores dos campos, na mesma ordem que o {@link #getPropertyNames()}
     * 
     * @return {@link Collection} de {@link JSON}
     */
    Collection<JSON> getPropertyValues();

    /**
     * Devolve todos os campos
     * 
     * @return String
     */
    Map<String, JSON> getAllProperties();

    /**
     * Devolve uma propriedade
     * 
     * @param propertyName String
     * @return JSON
     */
    JSON getProperty(String propertyName);

    /**
     * Seta uma propriedade
     * 
     * @param propertyName String
     * @param value JSON
     */
    void setProperty(String propertyName, JSON value);

    /**
     * Escreve o JSON
     * 
     * @param writer writer
     * @return writer
     * @throws IOException IOException
     */
    Writer write(Writer writer) throws IOException;
}
